package ioExample;

// 扫描指定目录，并找到名称或者内容中包含指定字符的所有普通文件（不包含目录）
// 注意：我们现在的方案性能较差，所以尽量不要在太复杂的目录下或者大文件下实验

// 低性能（目录很大就/包含的内容多就慢）

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;

public class Demo3 {
    public static void main(String[] args) throws IOException {
        // 输入扫描的文件 和 查询的关键词
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要扫描的路径：");
        File rootDir = new File(scanner.next());
        System.out.println("请输入要查询的关键词：");
        String toFind = scanner.next();

        /*// 判断该文件（目录）是否存在/空文件
        if(!rootDir.isDirectory() && !rootDir.isFile()) {  // 注意是&&：都不是才输出
            System.out.println("您输入的文件不存在！");
            return;
        }
        // 这个是可以忽略了，因为在传入之后 列举文件时也会判断null的
*/

        // 递归的扫描路径
        scanDir(rootDir,toFind);
    }

    // 递归的扫描路径
    private static void scanDir(File rootDir, String toFind) throws IOException {
        // 该目录下的文件(但是只是一层）
        File[] files = rootDir.listFiles();
        // 判断是否是空的，空就直接返回
        if(files == null) {
            return;
        }

        // 遍历文件（判断是普通文件 or 目录）
        for (File f:files) {
            if(f.isFile()) {
                // 普通文件就进行查找
                checkFile(f,toFind);
            }
            if(f.isDirectory()) {
                // 目录就继续进行递归扫描
                scanDir(f,toFind);
            }
        }
    }

    // 查看文件中是否包含关键字
    private static void checkFile(File f, String toFind) throws IOException {
        // 1. 先检查文件名中是否包含关键字
        if(f.getName().contains(toFind)) {
            System.out.println(f.getCanonicalFile() +"文件名中包含" + toFind);
        }
        // 2. 再检查文件内容中是否包含关键字
        // （此时要读取文件内容了：InputStream:同样使用try with source 避免忘记close文件）
        try(InputStream inputStream = new FileInputStream(f)) {
            StringBuilder stringBuilder = new StringBuilder();

            // 打开文件之后使用Scanner进行读文件
            Scanner in = new Scanner(inputStream);

            // 按行读取：放到StringBuilder中进行拼接!
            while (in.hasNextLine()) {
                stringBuilder.append(in.nextLine() + "\n"); // 存储到一行上，然后进行换行
            }

            // 判断存储的 stringBuilder 中是否包含关键字（就是按关键字找下标，下标如果是>-1的就说明找到了）
            if(stringBuilder.indexOf(toFind) > -1) {
                // 找该关键字的下标,下标大于-1就证明找到了，就说明该关键词是存在的
                System.out.println(f.getCanonicalFile() + "文件内容包含" +toFind);
            }
        }
    }
}
